BackForward
%MACRO printout( indata=, var=, group=, boot1=, boot2=, nrun=);
proc sort data=&indata out=intmp; by &group; run;
proc sql noprint;
   select distinct rassignt into: groupdiff separated by ' - '
   from ridamy.ittbur1
   order by rassignt;
quit;
PROC MEANS DATA= intmp NOPRINT;      /* get basic data from original sample */
  VAR &var;
  BY &group;
  OUTPUT OUT=basic;
RUN;

ods listing close;
proc ttest data=&indata;            /* Get Observed Tvalue from original sample */
   class &group;
   var &var;
   ods output TTests=ttests;
run;
ods listing;
data _null_;
   set ttests;
   if Method='Satterthwaite' then do;
      call symput('rsptobs', tvalue); /* Use tvalue for different variances */
   end;
run;
DATA summary0;                                      /* narrow down to mean and standard error of mean */
   SET basic; IF (_STAT_='MEAN' OR _STAT_='STD');
   IF _STAT_='STD' THEN &var = &var*&var;
   KEEP &var;
RUN;

PROC TRANSPOSE DATA=summary0 OUT=summary0;

DATA summary0;
   SET summary0;
   CALL SYMPUT('vald', col1-col3);
   CALL SYMPUT('valf', col2/col4);
RUN;

DATA combine;              /* now form difference of means and F ratios between each pair of samples */

  MERGE &boot1 (RENAME=( N=N1 mean=mean1 std= std1))
        &boot2 (RENAME=( N=N2 mean=mean2 std= std2));
  BY resampleid;
  diff = mean2-mean1;
  stddiff=(mean2-mean1)/sqrt(std1*std1/n1+std2*std2/n2);
  IF (std1 NE 0 AND std2 NE 0) THEN F = std2*std2/std1/std1; IF F<1 THEN F1=1/F;ELSE F1=F;

  KEEP stddiff diff F F1;
RUN;                     /* This is a dataset with differences of mean and ratios of standard errors
                            for each of the nrun observations */

PROC GCHART DATA=combine;
  VBAR diff / LEVELS= 50;
  TITLE  "Bootstrap difference in means: variable  &var   : observed value  &vald";
RUN;

PROC GCHART DATA=combine (WHERE=(F<16));
  VBAR F / LEVELS=50;
  TITLE  "Bootstrap F ratio: variable  &var  : observed value  &valf";
RUN;


PROC UNIVARIATE DATA=combine NOPRINT;       /* 95% confidence intervals for mean */
  VAR diff;
  OUTPUT OUT=outdiff PCTLPRE=p 
         PCTLPTS=2.5 97.5 5 95;
RUN;

PROC PRINT DATA=outdiff;
  TITLE "Bootstrap 95% confidence limit for difference in means (&groupdiff) &var" ;
RUN;


PROC UNIVARIATE DATA=combine NOPRINT;      /*95% confidence intervals for F ratio */
  VAR F;
  OUTPUT OUT=outf PCTLPRE=p 
         PCTLPTS=2.5 97.5 5 95;
RUN;

PROC PRINT DATA=outf;
  TITLE "Bootstrap 95% confidence limit for F ratio (&groupdiff) &var" ;
RUN;


PROC UNIVARIATE DATA=combine NOPRINT;      /*95% confidence limit for folded F ratio */
  VAR F1;
  OUTPUT OUT=outf PCTLPRE=p PCTLPTS= 95;
RUN;

PROC PRINT DATA=outf;
  TITLE "Bootstrap p-value for folded F ratio (&groupdiff) &var" ;
RUN;
proc sql;
   create table combine1 as
   select *
   from combine
   where stddiff>=&rsptobs;

   create table combine2 as
   select *
   from combine
   where stddiff <= &rsptobs;
quit;
data _null_;
   file print;
   pvalue=2*min(%nobs(combine1), %nobs(combine2))/&nrun;
   put /@5 "Hypothesis Test With Bootstrap for Testing Equality of Means";
   put  @5 "No Assumption of Equal Variances";
   put  @5 76*"="/;
   put @5 "Reference: Bradley Efron and Andersen J. Tibshirani (1998) An Introduction to"/
       @5 "Bootstrap. P224"/;
   put @5 "Two Sided Bootstrap P Value: " @45 pvalue 20.6  "; "/;
run;
proc sql;
   drop table intmp; drop table summary0; drop table combine; drop table outdiff; drop table outf; 
   drop table combine1; drop table combine2;
QUIT;
%MEND printout;